6-3 如何nestjs中集成ioredis
在 NestJS 中集成 Redis,可以使用社区开发的 @nestjs-modules/ioredis 模块。该模块封装了 Redis 的常见功能,提供了注册方法(包括 forRoot 和 forRootAsync),支持从配置文件读取 Redis 配置信息,并在 Controller 中通过依赖注入方便地使用 Redis 实例。
安装依赖
pnpm install @nestjs-modules/ioredis ioredis
bash
注意:该模块需要安装
reflect-metadata0.1.x 版本(不要用 0.2.x)。
pnpm install reflect-metadata@0.1.14
bash
直接注册方式
在模块中导入并注册 RedisModule:
import { RedisModule } from '@nestjs-modules/ioredis';
@Module({
imports: [
RedisModule.forRoot({
type: 'single',
url: 'redis://localhost:6379',
options: {
password: 'example', // 对应 ioredis 的 RedisOptions
},
}),
],
})
export class AppModule {}
typescript
forRoot 接收的 options 对应 ioredis 的 RedisOptions,支持 password、host、port 等标准 Redis 连接属性。
在 Controller 中使用
通过 @InjectRedis() 装饰器注入 Redis 实例:
import { InjectRedis, Redis } from '@nestjs-modules/ioredis';
@Controller()
export class AppController {
constructor(@InjectRedis() private redis: Redis) {}
@Get('token')
async getToken(@Query('token') token?: string) {
// 设置值(支持过期时间)
await this.redis.set('token', token || 'default token', 'EX', 600); // EX = 过期秒数,600秒 = 10分钟
// 读取值
const data = await this.redis.get('token');
return { token: data };
}
}
typescript
Redis SET 命令的过期时间参数:
EX— 过期时间(秒),如'EX', 600表示 10 分钟后过期PX— 过期时间(毫秒)- 在 Another Redis Desktop Manager 中可以看到 TTL 倒计时,到达零后 key 自动删除
异步注册方式
使用 forRootAsync 配合 ConfigService 从 .env 文件读取配置:
import { RedisModule } from '@nestjs-modules/ioredis';
@Module({
imports: [
RedisModule.forRootAsync({
type: 'single',
useFactory: (configService: ConfigService) => ({
url: `redis://${configService.get('DB_HOST')}:6379`,
options: {
password: 'example',
},
}),
inject: [ConfigService],
}),
],
})
export class AppModule {}
typescript
集群配置
在集群模式下,仍然使用 useFactory,配置 nodes 参数即可:
RedisModule.forRootAsync({
useFactory: () => ({
nodes: [
{ host: '127.0.0.1', port: 6380 },
{ host: '127.0.0.1', port: 6381 },
],
}),
})
typescript
集群模式下在 Controller 中使用方式不变,仍然通过 @InjectRedis() 注入 Redis 实例,底层逻辑由模块自动处理。
Redis 配置参数速查
Redis 配置文件(redis.conf)涵盖多个模块,以下列出常用配置项:
| 配置名 | 含义 | 默认值 | 是否支持热生效 |
|---|---|---|---|
| 网络 | |||
bind | 监听的 IP,空则接受所有网络连接 | 127.0.0.1 | 否 |
protected-mode | 保护模式,无密码且 bind 为空时生效 | yes | 否 |
port | 服务端口 | 6379 | 否 |
timeout | 客户端无数据 N 秒后断开,0 为禁用 | 0 | 否 |
tcp-keepalive | 周期性检测客户端健康状态(秒) | 0 | 否 |
| 安全 | |||
requirepass | 连接密码 | 空 | 是 |
| 内存策略 | |||
maxclients | 最大客户端连接数 | 10000 | 是 |
maxmemory | 节点最大内存,不能大于物理内存 | 无限制 | 是 |
maxmemory-policy | 内存淘汰策略 | noeviction | 是 |
| RDB 快照 | |||
save | RDB 保存条件(如 save 900 1 表示 900 秒内有 1 次更新就保存) | 多条规则 | 是 |
dbfilename | RDB 文件名称 | dump.rdb | 是 |
dir | RDB 文件存放目录 | Redis 安装目录 | 是 |
| AOF 持久化 | |||
appendonly | 是否开启 AOF 持久化 | no | 是 |
appendfilename | AOF 文件名称 | appendonly.aof | 否 |
appendfsync | AOF 同步磁盘频率:everysec / always / no | everysec | 是 |
| 集群 | |||
cluster-enabled | 是否开启 Redis 集群 | yes | 否 |
cluster-node-timeout | 集群节点超时时间(毫秒) | 15000 | 是 |
| 慢查询 | |||
slowlog-log-slower-than | 慢查询记录阈值(微秒) | 10000 | 是 |
slowlog-max-len | 慢查询记录条数 | 128 | 是 |
maxmemory-policy 淘汰策略说明:
volatile-lru:在设置了过期时间的 key 中,剔除最少使用的allkeys-lru:在所有 key 中剔除最少使用的volatile-random:在过期时间 key 中随机剔除allkeys-random:在所有 key 中随机剔除volatile-ttl:优先剔除即将过期的 keynoeviction:不做任何操作,直接返回 OOM 异常
更多配置详情参考 Redis 官方文档:https://redis.io/docs/latest/operate/oss_and_stack/management/config/
↑